package com.twj.tools.poi;

import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 作者: tianwenju
 * @version 1.0
 * @project 金税三期工程核心征管及应用总集成项目
 * @package com.twj.tools.poi
 * @file PDFImageExtractor.java 创建时间:2025年04月17日 16:08
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2020 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 提取PDF中的图片
 * @reviewer 审核人:
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 */
public class PDFImageExtractor {
    private List<String> imagePaths = new ArrayList<>();

    public List<String> extractImages(PDDocument document) throws IOException {
        for (int page = 0; page < document.getNumberOfPages(); ++page) {
            PDPage pdPage = document.getPage(page);
            processPage(pdPage);
        }
        return imagePaths;
    }

    private void processPage(PDPage pdPage) throws IOException {
        // 获取页面资源
        PDResources resources = pdPage.getResources();
        // 如果资源为空，则直接返回
        if (resources == null) {
            return;
        }

        // 遍历所有XObject名称
        for (COSName xObjectName : resources.getXObjectNames()) {
            // 获取XObject
            PDXObject xObject = resources.getXObject(xObjectName);
            // 检查XObject是否为图像类型
            if (xObject instanceof PDImageXObject) {
                // 将XObject转换为图像对象
                PDImageXObject image = (PDImageXObject) xObject;
                // 从图像对象中获取BufferedImage对象
                BufferedImage bim = image.getImage();
                // 创建临时文件以保存图像
                File imgFile = File.createTempFile("pdf-image-" + imagePaths.size(), "." + image.getSuffix());
                // 使用FileOutputStream打开临时文件以写入图像数据
                try (FileOutputStream fos = new FileOutputStream(imgFile)) {
                    // 将图像数据写入文件
                    ImageIO.write(bim, image.getSuffix(), fos);
                }
                // 将保存的图像文件路径添加到列表中
                imagePaths.add(imgFile.getAbsolutePath());
            }
        }
    }
}
